﻿using System;
using System.Text;

namespace TwinHead
{
    /// <summary>
    /// String 클래스를 확장합니다
    /// </summary>
    public static class StringExtensions
    {
        /// <summary>
        /// 현재 문자열을 바이트표기(16진수 표기)로 변경한다. ("Hi" ==> "48 69")
        /// </summary>
        /// <param name="s"></param>
        /// <returns></returns>
        public static string StringToHex( this string s )
        {
            byte[] buff = Encoding.UTF8.GetBytes( s );
            return BitConverter.ToString( buff ).Replace( "-", " " );
        }

        /// <summary>
        /// 16진수 표기를 일반 문자열 표기 변경한다. ("48 69" ==> "Hi")
        /// </summary>
        /// <param name="s"></param>
        /// <returns></returns>
        public static string HexToString( this string s )
        {
            string[] hexValuesSplit = s.Split( ' ' );
            byte[] bytes = new byte[hexValuesSplit.Length];
            for (int i = 0; i < hexValuesSplit.Length; i++)
            {
                string hex = (string)hexValuesSplit.GetValue( i );
                byte b = (byte)Convert.ToInt32( hex, 16 );
                bytes[i] = b;
            }
            return Encoding.UTF8.GetString( bytes );
        }

        /// <summary>
        /// 문자열을 바이트단위로 잘라서 리턴한다. 
        /// <para>문자를 바로잡아서 잘리지 않게 처리한다.</para>
        /// <para>UTF8 인코딩을 사용한다.</para>
        /// </summary>
        /// <param name="src">자를 문자열</param>
        /// <param name="length">길이</param>
        /// <returns></returns>
        public static string SubStringByte( this string src, int length )
        {
            return SubStringByte( src, length, Encoding.UTF8 );
        }
        /// <summary>
        /// 문자열을 바이트단위로 잘라서 리턴한다. 
        /// <para>문자를 바로잡아서 잘리지 않게 처리한다.</para>
        /// <para>UTF8 인코딩을 사용한다.</para>
        /// </summary>
        /// <param name="src">자를 문자열</param>
        /// <param name="length">길이</param>
        /// <param name="encoding">문자열 인코딩</param>
        /// <returns></returns>
        public static string SubStringByte( this string src, int length, Encoding encoding )
        {
            int srcLength = src.Length;
            if (srcLength == 0)
                return src;

            int charLength = srcLength > length ? length : srcLength;
            char[] chrs = src.ToCharArray( 0, charLength );

            int i = charLength;
            for (; i > 0; i--)
            {
                if (encoding.GetByteCount( chrs, 0, i ) <= length)
                    break;
            }
            return new string( chrs, 0, i );
        }
    }
}
